package com.jeesite.modules.utils;

import com.jeesite.common.lang.DateUtils;

import java.security.SecureRandom;
import java.util.Base64;
import java.util.UUID;
import java.util.concurrent.atomic.AtomicLong;

/**
 * 应用凭证生成器
 * 用于生成安全的APPID和AppSecret
 */
public class AppCredentialGenerator {
    
    // 使用原子长整型确保多线程环境下的唯一性（可选，根据实际需求）
    private static final AtomicLong counter = new AtomicLong(0);
    
    // 使用密码学安全的随机数生成器
    private static final SecureRandom secureRandom = new SecureRandom();
    
    // AppSecret默认长度
    private static final int DEFAULT_SECRET_LENGTH = 32;
    
    /**
     * 生成APPID
     * 使用UUID确保全局唯一性
     * @return 生成的APPID
     */
    public static String generateAppId() {
        // 使用UUID去除连字符，生成32位唯一标识符
        return "APP_" + DateUtils.getDate("yyyyMMdd")+"_"+UUID.randomUUID().toString().replace("-", "").toUpperCase().substring(20);
    }
    
    /**
     * 生成高强度AppSecret
     * 使用密码学安全的随机数生成器
     * @param length 密钥长度
     * @return 生成的AppSecret
     */
    public static String generateAppSecret(int length) {
        // 生成随机字节
        byte[] randomBytes = new byte[length];
        secureRandom.nextBytes(randomBytes);
        
        // 使用Base64编码并移除可能引起问题的字符
        String secret = Base64.getUrlEncoder().withoutPadding().encodeToString(randomBytes);
        
        // 确保长度准确
        return secret.length() > length ? secret.substring(0, length) : secret;
    }
    
    /**
     * 生成默认长度(32位)的AppSecret
     * @return 生成的AppSecret
     */
    public static String generateAppSecret() {
        return generateAppSecret(DEFAULT_SECRET_LENGTH);
    }
    
    /**
     * 生成完整的应用凭证对
     * @return 包含APPID和AppSecret的字符串数组
     */
    public static String[] generateAppCredentials() {
        String[] credentials = new String[2];
        credentials[0] = generateAppId();
        credentials[1] = generateAppSecret();
        return credentials;
    }
    
    /**
     * 验证AppSecret的强度
     * @param secret 待验证的密钥
     * @return 是否符合安全要求
     */
    public static boolean isSecretStrong(String secret) {
        if (secret == null || secret.length() < 16) {
            return false;
        }
        
        // 检查是否包含数字、大写字母、小写字母
        boolean hasDigit = false;
        boolean hasLower = false;
        boolean hasUpper = false;
        
        for (char c : secret.toCharArray()) {
            if (Character.isDigit(c)) hasDigit = true;
            if (Character.isLowerCase(c)) hasLower = true;
            if (Character.isUpperCase(c)) hasUpper = true;
        }
        
        return hasDigit && hasLower && hasUpper;
    }
    
    // 测试示例
    public static void main(String[] args) {
        // 生成一个APPID和AppSecret对
        String[] credentials = generateAppCredentials();
        System.out.println("生成的APPID: " + credentials[0]);
        System.out.println("生成的AppSecret: " + credentials[1]);
        System.out.println("密钥强度检查: " + (isSecretStrong(credentials[1]) ? "强" : "弱"));
        
        System.out.println("\n生成多个示例:");
        for (int i = 0; i < 3; i++) {
            String[] creds = generateAppCredentials();
            System.out.println("APPID: " + creds[0] + " | AppSecret: " + creds[1]);
        }
    }
}